package basicGrammar;

public class Demo3_OperationalCharacter {
    /*
        1.算数运算符
          + - *
          / :两个整数相除，不管用int还是double接收，都是计算结果取整的值
             如果想得到原始值，被除数和除数至少有一个为浮点类型，用浮点类型接收
             除数不能为0，否则报错
          % :小 % 大 余数一定是 小的这个数
          ++/--:
            a++ 和 ++a 的区别
              从计算的角度 a++和++a是一样的没有区别，相当于 a=a+1
              从返回值的角度 a++ 先返回后执行 a=a+1
                           ++a 先执行 a=a+1 再返回
        2.赋值运算符
          =：纯数学的角度，等号就是代表相等；但是在编程语言中代表赋值
          += / -= / *= / /=
          a+=1 等价于 a=a+1
        3.比较运算符
          == / < / <= / > / >= / !=
        4.逻辑运算符
          与：
            &正常与:不管第一个条件是true还是false，都必须执行第二个条件
            &&短路与:如果第一个条件时false，不执行第二个条件
          或：
            |正常或:不管第一个条件是true还是false，都必须执行第二个条件
            ||短路或:如果第一个条件是true，不执行第二个条件
          非:取反
        5.位运算符
          工作中很少用到，比较适合底层的运算，速度快
          在运算的时候将数字转成二进制之后再进行运算
          与(&)
            两个二进制的数字对应位置都为1,结果为1
            2 & 3 = 2
            a=15  b=127
            a & b = 15
          或(|)
            两个二进制的数字对应位置有1,结果为1
            2 | 3 = 3
            15 | 127 = 127
          非(!)
            取反
            !3 = 1100
          亦或(^)
            两个二进制数 对应位相同为0 不同为1
            15 ^ 127 = 112

        原码反码补码
          机器数
            一个数字在计算机中以二进制形式表示，就是机器数
            机器数是带符号的，用当前数位的最高位表示符号，正数为0，负数为1
            +3 长度为8位  机器数 0000 0011
            -3 长度为8位  机器数 1000 0011
          真值
            0000 0011 的真值 +000 0011 = +3
            1000 0011 的真值 -000 0011 = -3

          原码
            符号位加上真值的绝对值，用第一位表示符号，其余位表示值
            +3 0000 0011
            -3 1000 0011
          反码
            正数的反码就是自己本身，负数的反码是在源码的基础上，符号位不变，其余各位取反
            +3 0000 0011   反码 0000 0011
            -3 1000 0011   反码 1111 1100
          补码
            正数的补码就是自己本身，负数的补码，符号位不变，在反码的基础上+1
            +3 原码 0000 0011 反码 0000 0011  补码 0000 0011
            -3 原码 1000 0011 反码 1111 1100  补码 1111 1101
          为什么要使用原码反码补码
            计算机不能分辨出来符号位。
            用补码把带符号位的数字转成不带符号的值
            举例：20个学生，可以是正数第一名，也可以是倒数第20名
                 8位二进制数最高表示255(1111 1111),
                  带符号位的-3：1000 0011
                  可以理解为不带符号位的：1111 1101 (253)

            1-1 计算机中 1+(-1)
            原码：0000 0001 + 1000 0001 = 1000 0010 = -2 结果错误
            反码：0000 0001 + 1111 1110 = 1111 1111 = 1000 0000(原码) = -0 结果正确，但是0带符号
            补码：0000 0001 + 1111 1111 = 1 0000 0000 = 0000 0000 = 0 结果正确

         位移
           有符号左移(<<)
            在一定范围内，每位数向左移动一位,相当于原数字*2
            3 << 2 = 12
            -3 << 2 = -12 (需要用补码计算)
            经典面试题
              怎么样能高效的计算 2*8
              2 << 3  或者  8 < 1
          有符号右移(>>)
           在一定范围内，每位数向右移动一位,相当于原数字 /2
          无符号左移(<<<)
           把所有的数当做正数操作，无论正负，高位补0

          无符号右移(>>>)

     */

    public static void main(String[] args){
        int a = 10;
        int b = 20;

        int sum = a+b;
        System.out.println(sum);

        int diff = a-b;
        System.out.println(diff);

        int product = a*b;
        System.out.println(product);

        double result = 5/1;
        System.out.println(result);

        int remainder = 3 % 10;
        System.out.println(remainder);

//        int aNew = a++;
//        System.out.println(aNew);
//        System.out.println(a);

        int aNew1 = ++a;
        System.out.println(aNew1);
        System.out.println(a);

        int bNew = b+=1;
        System.out.println(bNew);

        boolean compareRes = 1!=3;
        System.out.println(compareRes);

        boolean andRes = !true;
        System.out.println(andRes);
    }
}
